/*
 * BZPController.h
 *
 *  Created on: 24/05/2014
 *      Author: javier
 */

#ifndef BZPCONTROLLER_H_
#define BZPCONTROLLER_H_

#include "BZPView.h"
#include "BZPModel.h"
#include "ServerMessageSender.h"
#include "ServerMessageListener.h"
#include "Properties.h"
#include "SoundManager.h"
#include "Mutex.h"
#include "Scenario.h"
#include <vector>

/*
 * Controlador del cliente, segun MVC
 */
class BZPController {
public:
	BZPController(BZPView* view, BZPModel* model, ClientSocket& socket, ClientSocket& socketReceptor);
	// Ejecuta el gameloop, donde en cada ciclo escucha nuevos eventos del teclado o mouse y
	// ejecuta las acciones correspondientes sobre el modelo
	void mainLoop();
	// Actualiza la posicion de un objeto, segun su ID. Propaga este cambio al modelo
	void updatePosition(int id, double x, double y);
	// inserta el nuevo objeto en el modelo
	void newObject(Positionable *p);
	// quita el objeto del modelo, buscando por ID
	void removeObject(int id);
	// Define el ID del bomberman del jugador. Con esta informacion, la camara se desplaza.
	void setIDTarget(int id);
	/*
	 * Metodos que propagan una orden generad en la vista hacia el modelo o los threads de comunicaciones
	 */
	void newGame();
	void joinGame();
	void showCampaigns();
	void showPartidas();
	void showWaitingPlayers();
	void showMainMenu();
	void decideStartGameView();
	void sendSelectCampaign(std::string& idCampania, std::string& nombrePartida);
	void sendSelectedMatch(std::string& idPartida);
	void sendStartMatch(bool comenzar, string & idPartida);

	// Carga un escenario a la vista y al modelo, usando la representacion en caracteres.
	void loadScenario(Scenario& s);
	void loadNextScenario();
	// actualiza el puntaje mostrado en pantalla.
	void updateScores(std::string scores);
	// envia un mensaje al servidor para reiniciar el estado de las comunicaciones.
	// Esto se hace cada vez que el cliente debe volver al menu principal
	void sendResetGameMessage();
	// restablece todo el estado del juego (modelo y vista)
	void clear();

	void exit();
	virtual ~BZPController();
	void setCampaigns(const std::string& campaigns);
	void setPartidas(std::string partidas);
	void showNextMatchView();
	void showEndCampaignView();
private:
	BZPView* view;
	BZPModel* model;
	ServerMessageSender sender;
	ServerMessageListener listener;
	Properties properties;
	SoundManager sound;
	bool running;
	Mutex mutex;
	std::string campaigns;
	std::string partidas;
};

#endif /* BZPCONTROLLER_H_ */
